﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entidad;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace Dao
{
    public class IngresaNotaAlumnoDao
    {
        private static SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["AcademicoConnectionString"].ConnectionString);
        public static SqlCommand cmd;
        public static List<NotaAlumno> ObtenerTodo(int codAsignatura)
        {
            List<NotaAlumno> listInscripAlumnos = new List<NotaAlumno>();
            string sql = @"SELECT np.codNota, ixa.legajo, a.apellido + ', ' + a.nombre as apenom, tp.tipoNota, tp.descripcion, np.nota, np.fecha, np.observacion 
                         From NotaParciales np INNER JOIN InscripcionXAlumno ixa ON np.legajo= ixa.legajo
                         INNER JOIN Alumno a ON ixa.legajo=a.legajo 
                         inner JOIN TipoNota tp ON np.tipoNota = tp.tipoNota 
                         WHERE np.codAsignatura=@CodAsignatura
                         group by np.codNota, ixa.legajo, a.apellido, a.nombre, tp.tipoNota, tp.descripcion, np.nota, np.fecha, np.observacion
                         order by ixa.legajo";
            cmd = new SqlCommand(sql, cn);
            cmd.Parameters.Add("@CodAsignatura", SqlDbType.Int).Value = codAsignatura;

            try
            {
                cn.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    NotaAlumno na = new NotaAlumno();
                    na.codNota = (int)dr["codNota"];
                    na.legajo = (int)dr["legajo"];
                    na.nombre = dr["apenom"].ToString();
                    na.tipoNota = (int) dr["tipoNota"];
                    na.descripcion = dr["descripcion"].ToString();
                    if (dr["nota"].ToString() != string.Empty)
                        na.nota = (int)dr["nota"];
                    else
                        na.nota = null;
                    if (dr["fecha"].ToString() != string.Empty)
                        na.fecha = DateTime.Parse(dr["fecha"].ToString());
                    else
                        na.fecha = null;
                    na.observacion = dr["observacion"].ToString();
                    
                    listInscripAlumnos.Add(na);
                }
                dr.Close();
                cn.Close();
            }
            catch (SqlException ex)
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
                throw new ApplicationException("Error BD InscripcionXAlumno, NotaParciales, Alumno.\n Problemas:" + ex.Message);
            }
            return listInscripAlumnos;

        }
        public static List<Alumno> ObtenerAlumnos(int codAsignatura)
        {
            List<Alumno> listInscripAlumnos = new List<Alumno>();
            string sql = @"SELECT ixa.legajo, a.apellido + ', ' + a.nombre as apenom 
                         From InscripcionXAlumno ixa INNER JOIN Alumno a ON ixa.legajo=a.legajo 
                         WHERE ixa.codAsignatura=@CodAsignatura ORDER BY a.apellido";
            cmd = new SqlCommand(sql, cn);
            cmd.Parameters.Add("@CodAsignatura", SqlDbType.Int).Value = codAsignatura;

            try
            {
                cn.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    Alumno alu = new Alumno();
                    alu.legajo = (int)dr["legajo"];
                    alu.nombre = dr["apenom"].ToString();
                    listInscripAlumnos.Add(alu);
                }
                dr.Close();
                cn.Close();
            }
            catch (SqlException ex)
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
                throw new ApplicationException("Error BD InscripcionXAlumno, Alumno. \n Problemas:" + ex.Message);
            }
            return listInscripAlumnos;

        }
        public static NotaAlumno ObtenerPorID(int codAsignatura, int legajo)
        {
            NotaAlumno na = new NotaAlumno();
            string sql = @"SELECT np.codNota, ixa.legajo, a.apellido + ', ' + a.nombre as apenom, tp.descripcion, np.nota, np.fecha, np.observacion 
                         From InscripcionXAlumno ixa INNER JOIN Alumno a ON ixa.legajo=a.legajo 
                         LEFT JOIN NotaParciales np ON ixa.legajo = np.legajo LEFT JOIN
                         TipoNota tp ON np.tipoNota = tp.tipoNota WHERE ixa.codAsignatura=@CodAsignatura and np.legajo=@Legajo";
            cmd = new SqlCommand(sql, cn);
            cmd.Parameters.Add("@CodAsignatura", SqlDbType.Int).Value = codAsignatura;
            cmd.Parameters.Add("@Legajo", SqlDbType.Int).Value = legajo;

            try
            {
                cn.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    na.codNota = (int)dr["codNota"];
                    na.legajo = (int)dr["legajo"];
                    na.nombre = dr["apenom"].ToString();
                    na.tipoNota = (int)dr["tipoNota"];
                    na.descripcion = dr["descripcion"].ToString();
                    if (dr["nota"].ToString() != string.Empty)
                        na.nota = (int)dr["nota"];
                    else
                        na.nota = null;
                    if (dr["fecha"].ToString() != string.Empty)
                        na.fecha = DateTime.Parse(dr["fecha"].ToString());
                    else
                        na.fecha = null;
                    na.observacion = dr["observacion"].ToString();
                }
                dr.Close();
                cn.Close();
            }
            catch (SqlException ex)
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
                throw new ApplicationException("Error BD InscripcionXAlumno, NotaParciales, Alumno. \n Problemas:" + ex.Message);
            }
            return na;

        }
        public static List<Asignatura> ObtenerAsignaturas(int legajo)
        {
            List<Asignatura> listAsignatura = new List<Asignatura>();
            string sql = @"SELECT    a.codAsignatura, m.nombre, c.numAula, a.turno
                         FROM Asignatura a INNER JOIN
                         Curso c ON a.codCurso = c.codCurso INNER JOIN
                         Materia m ON a.codMateria = m.codMateria
                         WHERE a.legDocente = @Legajo ORDER BY m.nombre";
            SqlCommand cmd = new SqlCommand(sql, cn);
            cmd.Parameters.Add("@Legajo", SqlDbType.Int).Value = legajo;
            try
            {
                cn.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    Asignatura asi = new Asignatura();
                    asi.codAsignatura = (int)dr[0];
                    asi.nombreMateria = dr[1].ToString() + " - Aula " + dr[2].ToString() + " - " + dr[3].ToString();

                    listAsignatura.Add(asi);
                }
                dr.Close();
                cn.Close();
            }
            catch (SqlException ex)
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
                throw new ApplicationException("Error BD Asignatura \n Problema:" + ex.Message);
            }
            return listAsignatura;

        }
        public static void InsertarNota(NotaAlumno alu, int codAsignatura)
        {
            string sql = @"insert into NotaParciales (legajo,codAsignatura,tipoNota,nota,fecha,observacion) 
         values (@Legajo,@CodAsignatura,@TipoNota,@Nota,@Fecha,@Observacion)";

            try
            {
                cn.Open();
                cmd = new SqlCommand(sql, cn);
                cmd.Parameters.Add("@Legajo", SqlDbType.Int).Value = alu.legajo;
                cmd.Parameters.Add("@CodAsignatura", SqlDbType.Int).Value = codAsignatura;
                cmd.Parameters.Add("@TipoNota", SqlDbType.Int).Value = alu.tipoNota;
                cmd.Parameters.Add("@Nota", SqlDbType.Int).Value = alu.nota;
                cmd.Parameters.Add("@Fecha", SqlDbType.Date).Value = alu.fecha;
                cmd.Parameters.Add("@Observacion", SqlDbType.VarChar, 100).Value = alu.observacion;
                
                cmd.ExecuteNonQuery();
                cn.Close();
            }
            catch (SqlException ex)
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
                throw new ApplicationException("Error BD Nota Parciales\n Problema:" + ex.Message);
            }
        }
        public static void ActualizarNota(NotaAlumno alu, int codAsignatura)
        {
            string sql = @"update NotaParciales set nota=@Nota, tipoNota=@TipoNota, fecha=@Fecha,observacion=@Observacion
                            where codNota=@CodNota";

            try
            {
                cn.Open();
                cmd = new SqlCommand(sql, cn);
                cmd.Parameters.Add("@CodNota", SqlDbType.Int).Value = alu.codNota;
                cmd.Parameters.Add("@TipoNota", SqlDbType.Int).Value = alu.tipoNota;
                cmd.Parameters.Add("@Nota", SqlDbType.Int).Value = alu.nota;
                cmd.Parameters.Add("@Fecha", SqlDbType.Date).Value = alu.fecha;
                cmd.Parameters.Add("@Observacion", SqlDbType.VarChar, 100).Value = alu.observacion;

                cmd.ExecuteNonQuery();
                cn.Close();
            }
            catch (SqlException ex)
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
                throw new ApplicationException("Error BD Nota Parciales\n Problema:" + ex.Message);
            }
        }
        public static bool ValidarInscripciones(int codAsignatura)
        {
            bool valido = false;
            string sql = @"SELECT ixa.legajo, a.apellido + ', ' + a.nombre as apenom 
                         From InscripcionXAlumno ixa INNER JOIN Alumno a ON ixa.legajo=a.legajo 
                         WHERE ixa.codAsignatura=@CodAsignatura";
            cmd = new SqlCommand(sql, cn);
            cmd.Parameters.Add("@CodAsignatura", SqlDbType.Int).Value = codAsignatura;

            try
            {
                cn.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                    valido = true;
                dr.Close();
                cn.Close();
            }
            catch (SqlException ex)
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
                throw new ApplicationException("Error BD InscripcionXAlumno, Alumno. \n Problemas:" + ex.Message);
            }
            return valido;

        }
    }
}
